package org.dxw.common.util;

import java.math.BigDecimal;

/**
 * BigDecimal工具类
 * 帮助理解并使用BigDecimal
 * BigDecimal 不是说比double float 保留的小数位更多
 * 而是说BigDecimal有精度这个概念，只要设置了精度，就能 准确的表示这个小数，如1.00 double在计算机中存的是
 * 0.999999999999999999999999882828828282，而Bigdecimal存的就是 1.00
 *
 * 1 除法必须要指定精度和舍入策略，不然出现无限循环小数，会报错
 * 2 比较大小可以使用 bigDecimal1.compareTo(bigDecimal2) -1 bigDecimal1<bigDecimal2 , 0 等于， 1 大于
 *
 */
public class BigDecimalUtil {

    /**-----------------------初始化BigDecimal begin-------------------------------------**/

    public static BigDecimal toBigDecimal(String number){
        return new BigDecimal(number);
    }

    /**
     *
     * @param number
     * @param scale
     * @param roundingMode 如：ROUND_HALF_UP
     * @see  BigDecimal#ROUND_HALF_UP
     * @return
     */
    public static BigDecimal toBigDecimal(double number, int scale, int roundingMode){
        return new BigDecimal(number).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    public static BigDecimal toBigDecimal(int number){
        return new BigDecimal(number);
    }


    /**-----------------------初始化BigDecimal end-------------------------------------**/


    public static BigDecimal divide(BigDecimal bigDecimal1, BigDecimal bigDecimal2, int scale, int roundingMode){
        if(bigDecimal2.compareTo(BigDecimal.ZERO)==0){
            throw new IllegalArgumentException("除数不能为0");
        }
        return bigDecimal1.divide(bigDecimal2, scale, roundingMode);
    }

    /**
     *
     * @param bigDecimal1
     * @param bigDecimal2
     * @param scale
     * @param roundingMode
     * @return -1 0 1 表示 bigDecimal1 小于 等于 大于 bigDecimal2
     */
    public static int compareTo(BigDecimal bigDecimal1, BigDecimal bigDecimal2, int scale, int roundingMode){
        return bigDecimal1.compareTo(bigDecimal2);
    }


}
